<?php
namespace core\models;
/**
 * 网站消息提示类
 * @package 扩展库
 * @subpackage 网站消息提示
 * @author osCommerce
 * @example
 * Example 1:
 * <code>
 * $MessageStack = new MessageStack();
 * $MessageStack->add('global', 'Error: Error 1', 'error');
 * $MessageStack->add('global', 'Error: Error 2', 'warning');
 * if ($MessageStack->size('global') > 0) echo $MessageStack->output('global');
 * </code>
 * Example 2(通过session设置到其它页再显示):
 * <code>
 * $MessageStack->addSession('global', 'Error: Error 1', 'error');
 * $MessageStack->addSession('global', 'Error: Error 1', 'error');
 * </code>
 * 目标页面的代码：
 * <code>
 * if ($MessageStack->size('global') > 0) echo $MessageStack->output('global');
 * </code>
 */
class MessageStack {
    // class constructor
    public function __construct(){
        $this->messages = array();
        if (isset($_SESSION['messageToStack'])) {
            for ($i=0, $n=sizeof($_SESSION['messageToStack']); $i<$n; $i++) {
                $this->add($_SESSION['messageToStack'][$i]['text'], $_SESSION['messageToStack'][$i]['type'], $_SESSION['messageToStack'][$i]['class']);
            }
            unset($_SESSION['messageToStack']);
        }

    }

    /**
     * 添加消息到messages数组，用于页面不需要跳转就显示消息的情况
     * @param string $message 消息内容
     * @param string $type    消息类型：error=错误(0)，warning=警告(2)，success=成功(1)
     * @param string $class   级别本站默认用global
     */
    public function add($message, $type = 'error', $class = 'global') {
        $class = ($class == 'header' ? 'global' : $class);
        if ($type == 'error') {
            $this->messages[] = array('params' => 'class="messageStackError"', 'class' => $class, 'text' => /*'error.gif' . '&nbsp;' .*/ $message);
        } elseif ($type == 'warning') {
            $this->messages[] = array('params' => 'class="messageStackWarning"', 'class' => $class, 'text' => /*'warning.gif' . '&nbsp;' .*/ $message);
        } elseif ($type == 'success') {
            $this->messages[] = array('params' => 'class="messageStackSuccess"', 'class' => $class, 'text' => /*'success.gif' . '&nbsp;' .*/ $message);
        } else {
            $this->messages[] = array('params' => 'class="messageStackError"', 'class' => $class, 'text' => $message);
        }
    }

    /**
     * 添加消息到messageToStack数组（SESSION方式），用于页面跳转后再显示消息的情况
     * @param string $message 消息内容
     * @param string $type    消息类型：error=错误(0)，warning=警告(2)，success=成功(1)
     * @param string $class   提示的级别名称。本站默认用header，如果你不知道用什么的话就让此参数为空值即可！
     */
    public function addSession($message, $type = 'error', $class = 'global') {
        if(!$class){
            $class = 'global';
        }
        $_SESSION['messageToStack'][] = array('class' => $class, 'text' => $message, 'type' => $type);
    }
    /**
     * 清空消息盒子信息
     */
    public function reset() {
        $this->messages = array();
    }

    /**
     * 输出messages数组中保存的消息
     *
     * @param string $class 级别本站默认用global
     *
     * @return string
     */
    public function output($class) {
        $rtn = '<ul id="message">';
        if (is_array($this->messages)) {
            foreach($this->messages as $val) {
                $rtn .= '<li ' . $val['params'] . '>' . $val['text'] . '</li>';
            }
        }
        $rtn .= '</ul>';
        return $rtn;
    }
    /**
     * 统计消息盒子中的消息总数
     * @param string $class 级别本站默认用global
     * @return int|0
     */
    public function size($class) {
                //print_r($this->messages);exit;
        $count = 0;
        for ($i=0, $n=sizeof($this->messages); $i<$n; $i++) {
            if ($this->messages[$i]['class'] == $class) {
                $count++;
            }
        }
        return $count;
    }
}